from __future__ import division
import sys,os,time
from time import sleep
from src.Equipments.LockIn import SR830
from src.Equipments.RFGenerator import N5181A
from src.Equipments.EDMR_magnet import EDMRmagnet
#from src.Equipments.multimeter import AgilentMulti
#from src.Equipments.gaussmeter import Lakeshore455

from src.Data.DataStructure import Data

import numpy as np
import matplotlib.pyplot as plt

User="Christophe"
#import pylab as plb
home_path=os.getcwd()+os.sep#Current path to this program
sys.path.append(home_path+"src"+os.sep)
data_path=home_path+"Users"+os.sep+User+os.sep+"data"+os.sep#For saving later on data
#print data_path

#########################################################
### Parameters - Sweeping settings
#########################################################
#frequency_start=7033-100 #MHz
#frequency_stop=7033+100 #MHz
Bstart = -20 #magnetic field starting value
Bend = 100 #magnetic field ending value
Bres = 0.1 #magnetic field resolution
#Minimum waiting time = about 300 ms (plot time is limitant)
waiting_time=500    #ms, Waiting time for each point

test=False #If standalone without anything connected->True

number_of_points = int((Bend-Bstart)/Bres)

#########################################################
#########################################################


#########################################################
### Parameters - lockin
#########################################################
lockin = SR830("GPIB0::9::INSTR")
lockin.Reset_Memory()
lockin.Set_InterExter_Mode(1) #1 for internal mode, 2 for external mode (generated by RF-gen)
#lockin.Set_Harm(2)  #number of harmonics
#lockin.Set_Freq(5000) #modulation frequency in Hz
#########################################################
#########################################################

#########################################################
### Parameters - Gaussmeter
#########################################################
#gaussmeter=Lakeshore455("GPIB0::12::INSTR",test)
#########################################################
#########################################################

#########################################################
### Parameters - RF setup
#########################################################
RF=N5181A()
#F.Set_Modulation(5232,100)    #Frequency Hz, Modulation deviation kHz / amplitude dB
#F.Set_Modulation_Output(False,False)    #Modulation On = True, LFOutput On = True
#RF.Set_Power(0)  #dBm
#RF.Set_Frequency(freq)
#RF.Set_Output_ONOFF(True)
#########################################################
#########################################################


#########################################################
### Parameters - Data saving
#########################################################
data=Data(given_name="",
        path=data_path,
        comments="",
        rows=number_of_points,
        columns=3,#Field, 2 phases
        light=True,
        temperature=5,#K
        scan_mode="field",
        phase=0,#in degree
        modulation_frequency=10,#in kHz
        modulation_amplitude=1,#in V,
        time_constant=0.3, #in s
        frequency=9.08229,#MHz
        power=50,#dB
        picture_saving_format='eps',
        user=User)
data.step=0 #Initial value
#########################################################
#########################################################
magnet = EDMRmagnet(False)
magnet.OpenRessource()
magnet.SetMagneticField(Bstart, "gauss")
sleep(1)
#########################################################
### Measure
#########################################################
def DoMeasure(arg):
    #Change frequency
    #frequency=frequency_start+i*(frequency_stop-frequency_start)/(number_of_points-1)
    #RF.Set_Frequency(frequency)#MHz
    #data.data[i,0]=frequency
    ti=time.time()
    if data.step <number_of_points-1:
        data.data[data.step,0]=Bstart+data.step*Bres
        data.data[data.step,1:3]=lockin.Read_XY()
        print "B0 = ",data.data[data.step,0]," G, A = ",data.data[data.step,1],"V, B = ",data.data[data.step,2],"V"
        #print "f = ",frequency,"MHz, A = ",data.data[i,1],"V, B = ",data.data[i,2],"V"
        data.step+=1
        magnet.SetMagneticField(Bstart+data.step*Bres, "gauss")
    elif data.step == number_of_points-1:
        data.data[data.step,0]=gaussmeter.Measure_Field()
        data.data[data.step,1:3]=lockin.Read_XY()
        print "B0 = ",data.data[data.step,0]," mT, A = ",data.data[data.step,1],"V, B = ",data.data[data.step,2],"V"
        data.Save_data()
        #has to be after data.Save_data because that method fill the self.full_saving_path value
        plt.savefig(data.full_saving_path+'.'+data.picture_saving_format,format=data.picture_saving_format)
        data.step+=1
        magnet.SetMagneticField(Bstart+data.step*Bres, "gauss")
        print "Complete."
    else:
        magnet.CloseRessource()
    DoTime=time.time()-ti
    if waiting_time-DoTime*1000<=0:
        DeltaTDo=waiting_time
    else:
        DeltaTDo=waiting_time-DoTime*1000
    TimerDo.interval=DeltaTDo
#########################################################
#########################################################


#########################################################
### Plotting
#########################################################
fig = plt.figure(1)
ax = fig.add_subplot(111)
ax.grid(True)
ax.set_title("Magnetic field sweep")
ax.set_xlabel("Magnetic field (G)")
ax.set_ylabel("SDR signal (uV)")
ax.axis([0,1,0,1])
line=ax.plot([0,1],[0,1],'o-')
manager = plt.get_current_fig_manager()

def RealtimePloter(arg):
    global values
    ti=time.time()
    if data.step>0:
        
        xaxismin  = data.data[0:data.step+1,0].min()
        xaxismax = data.data[0:data.step+1,0].max()
        
        y1min = data.data[0:data.step+1,1].min()
        y1max = data.data[0:data.step+1,1].max()
        y1axismin = y1min
        y1axismax = y1max
            
        ax.axis([xaxismin,xaxismax,y1axismin,y1axismax])
        line[0].set_data(data.data[0:data.step,0],data.data[0:data.step,1])
        
        manager.canvas.draw()
    PlotTime=time.time()-ti
    if waiting_time-PlotTime*1000<=0:
        DeltaTPlot=waiting_time
    else:
        DeltaTPlot=waiting_time-PlotTime*1000
    TimerPlot.interval=DeltaTPlot
    #manager.show()



TimerPlot = fig.canvas.new_timer(interval=waiting_time)
TimerPlot.add_callback(RealtimePloter, ())
TimerDo = fig.canvas.new_timer(interval=waiting_time)
TimerDo.add_callback(DoMeasure, ())
TimerPlot.start()
TimerDo.start()

plt.show()
#########################################################
#########################################################